#define USE_V200 //définit le support pour lequel on compile
#define OPTIMIZE_ROM_CALLS
#define MIN_AMS 100 //définit la version minimale de l'OS

#include <stdlib.h>
#include <stdio.h>

#include <kbd.h>
#include <compat.h>
#include <tigcclib.h>

#define SAVE_SCREEN //permet de restaurer l'écran initial après l'exécution

// Normalement pour la répétition des touches mais semble être inutile
//#define KB_AUTOREPEAT (1<<11)

#include "main.h"

/* Code touches V200
 * ESC = 264
 * a = 113
 * z = 119
 * e = 101
 * q = 97
 * s = 115
 * d = 100
 */

void _main(void)
{
  // Activer la répétition des touches
  OSFastArrows = 0;
  // Temps entre chaque répétition
  OSInitBetweenKeyDelay(30);
  // Temps avant que la touche ne se répète pour la première fois
  OSInitKeyInitDelay(90);


  // DEFINITION DES SPRITES
	unsigned char image_proj[16] = {
    0x00,0x04,0x00,0x00,
    0x04,0x00,0x0E,0x03,
    0x04,0x17,0x06,0x03,
    0x10,0x06,0x2A,0x16
  };
  unsigned short image_heros[32] = {
    0x0010,0x0420,0x0000,0x0000,
    0x0430,0x00B0,0x0E30,0x03E8,
    0x0428,0x17E8,0x0660,0x03E0,
    0x1068,0x0664,0x2A10,0x16F8,
    0x0DC0,0x0020,0x0248,0x0A40,
    0x0B60,0x0900,0x04B0,0x1760,
    0x1CB0,0x1F68,0x08A0,0x0848,
    0x0680,0x37E0,0x01C4,0x2904
  };
  unsigned long image_dragon[64] = {
    0x00040000,0x00060800,0x00071C00,0x00071C00,
    0x0007BC00,0x0007F9C0,0x000FFFC0,0x001FFFA0,
    0x003FFF30,0x003FFFF8,0x007FFFDC,0x04FFFF9E,
    0x0DFDDF9F,0x0DF3FF9F,0x1AE77F1F,0x1A5EFF3B,
    0x361CFE3F,0x2609FC5F,0x3F01F8FF,0x3F8DFFFF,
    0x3FEDFFFF,0x3FEFFFFF,0x3FEDFFFB,0x1FE7FE73,
    0x1FF7FC31,0x1FD7FE10,0x0EDFFF00,0x0EDFFFC0,
    0x075FFFE0,0x030FFFF0,0x000FFFF0,0x0007FFF0,
    0x00040000,0x00060800,0x00071C00,0x00071C00,
    0x0007BC00,0x0007F9C0,0x000CDFC0,0x00180FA0,
    0x00300730,0x003033F8,0x006371DC,0x04C7F99E,
    0x0D9DF09F,0x0DF3B19F,0x1EE7B319,0x1E5F6335,
    0x3A1D4623,0x3A0A8C67,0x230218DF,0x31863F8F,
    0x30F63B1F,0x30741F9F,0x303207DB,0x13B80E73,
    0x1BF80C31,0x1FD80E10,0x0ED80300,0x0EDC0180,
    0x075800C0,0x030C8CD0,0x000FE280,0x0007FFF0
  };
  ////////////////////////

  // Activation des features pour les sprites
  if (!GrayOn ()) printf("Erreur GrayOn()\n");

	screen ecran = SCRnew();
	SCRsetProp(ecran, 0, LCD_WIDTH, 0, LCD_HEIGHT);

  short loop = 1;
  unsigned short key;

	// Affichage d'un menu
	clrscr();
	// TODO RM > flemme de coder un truc propre avec une surbrillance qui depend de la position du curseur, j'y reflechis pour la prochaine fois.
	printf("PROJETIPM_BH/RA\n\nProchain combat : 1\nBoutique : 2\nInventaire : 3\nMenu principal : 4\n"); //menu
	// 49 = touche 1, 50 = 2, 51 = 3, 52 = 4
	while( loop )
  {
    // Si une touche a été appuyée
    if( kbhit() )
    {
      key = ngetchx();
      switch( key )
      {
        case 49: // 1 : jouer
          loop = 0;
          break;
        case 50: // 2 : boutique
					clrscr();
					GrayOff();
					exit(0);
          break;
        case 51: // 3 : inventaire
        	clrscr();
					GrayOff();
					exit(0);
        	break;
        case 52: // 4 : quit
        	clrscr();
        	GrayOff();
					exit(0);
          break;
        default:
          break;
      }
    }
    else{}
  }

	// Test de deplacement de sprite
  clrscr();

	personnage perso = Pnew(SPRITE16);
	PsetSpeed(perso, SPEED);
	PmoveTo(perso, X_START, Y_START);
	PsetHP(perso, 100);
	PsetHPMax(perso, 100);

  SPRsetSprite16(PgetSkin(perso), image_heros);

  /* rappel de la structure d'une arme/d'un sort
  char* nom;
	int prix; // prix d'achat a la boutique
	int level; // niveau necessaire, permet de voir quand on insere l'arme dans la liste d'objets de la boutique
	int dmgmin; // minimum de degats infliges par l'arme
	int dmgmax; // maximum de degats infliges
	int dist; // dist = 0 -> corps a corps ; dist=1 -> arme de lancer */
	// il fait des warnings relous a la compilation mais ca marche.

	arme epee = WPNnew();
	WPNsetName(epee, "Epée");
	WPNsetLevel(epee, 1);
	WPNsetDmgMin(epee, 10);
	WPNsetDmgMax(epee, 12);

	// Projectile type
	projectile proj = PROnew();
	projectiles projs = PROJSnew();
	SPRsetSprite8(PROgetSpr(proj), image_proj);

	/*
  arme* wpncac=malloc(sizeof(struct arme));
  wpncac->nom="Gourdin";wpncac->prix=1;wpncac->level=0;wpncac->dmgmin=1;wpncac->dmgmax=5;wpncac->dist=0;
  arme* wpndst=malloc(sizeof(struct arme));
  wpndst->nom="Arc";wpndst->prix=2;wpndst->level=2;wpndst->dmgmin=5;wpndst->dmgmax=6;wpndst->dist=1;
  sort* splcac=malloc(sizeof(struct arme));
  splcac->nom="Shield";splcac->prix=50;splcac->level=5;splcac->dmgmin=10;splcac->dmgmax=10;splcac->dist=0;
  sort* spldst=malloc(sizeof(struct arme));
  splcac->nom="Fireball";splcac->prix=1000;splcac->level=42;splcac->dmgmin=500;splcac->dmgmax=1000;splcac->dist=1;

  inventaire* inv=malloc(sizeof(struct inventaire));
  inv->wpn1=wpncac;inv->wpn2=wpndst;inv->spl1=splcac;inv->spl2=spldst;
  perso->inv=inv;


	perso->hp=15;perso->hpmax=20;

  personnage* dragon = malloc( sizeof(struct personnage) );
  dragon->x = X_START + 40;
  dragon->y = Y_START + 20;
  dragon->speed = SPEED;
  dragon->d.x = 0;
  dragon->d.y = 0;
  dragon->skin = init_sprite(SPRITE32);
  set_sprite_type(dragon, SPRITE32);
  set_sprite32(dragon->skin, image_dragon);

  display_perso(perso);
  display_perso(dragon);
	*/
	Pdisplay(perso);

  //affiche_inventaire(perso);

	loop = 1; // au cas ou

  while( loop )
  {
    // Si une touche a été appuyée
    if( kbhit() )
    {
      key = ngetchx();
      //printf("You pressed %d\n", key);

      switch( key )
      { // je suis passe en valeur numeriques pour les KEYS car le compilateur tigcc pour windows ne connait pas ces constantes
        case 264: // ESC
          loop = 0;
          break;
        case 344: // KEY_DOWN
          PsetDir(perso, DOWN);
          break;
        case 340: // KEY_RIGHT
          PsetDir(perso, RIGHT);
          break;
        case 338: // KEY_UP
          PsetDir(perso, UP);
          break;
        case 337: // KEY_LEFT
          PsetDir(perso, LEFT);
          break;
        case 105: // I
        	//affiche_inventaire(perso);
        	break;
				case 108: // L
					PROsetX(proj, PgetX(perso));
					PROsetY(proj, PgetY(perso));
					PROsetSpeed(proj, PgetSpeed(perso));
					Plancer(perso, projs, proj);
					break;
        default:
          break;
      }
      Pmove(perso, ecran);
			PsetDir(perso, NONE);
    }
    else // Pas de touche détectée
    {
			//PROJSmove(projs, ecran);
    }
    // Dans tous les cas
  } // Fin du loop

  // Désactivation des features pour les sprites

  GrayOff();

  //zone de test !
  tracerBoutique();
  loop=1;
	while( loop )
  {
    // Si une touche a été appuyée
    if( kbhit() )
    {
      key = ngetchx();
      switch( key )
      {
        case 264: // ESC
          loop = 0;
          break;
        default:
          break;
      }
    }
  }
  //fin zone de test

  Pfree(perso);
	SCRfree(ecran);
  //free_personnage(dragon);

}

